﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once

#include "GcmpModelInterface.h"
#include "IObject.h"
#include "GcmpApiDeclaration.h"
#include "INoElementIdDbObject.h"

namespace gcmp
{
    class IModelView;
    class IElement;

    /// \brief 视图平面过滤器
    ///
    /// 对视图平面（视口，深度方向）进行过滤
    class GCMP_MODEL_INTERFACE_EXPORT IModelViewPlaneFilter : public INoElementIdDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IModelViewPlaneFilter, gcmp::INoElementIdDbObject);
    public:
        virtual ~IModelViewPlaneFilter();      

        /// \brief 是否忽略视图深度方向的平面，使其不参与是否视图范围检查、剖切等。
        /// \param pModelView 视图指针
        /// \param pIsSkipCutPlane 是否忽略切面，注意！这个输出参数只有在忽略深度方向的平面的情况下才有效；可能为空，空表示不需要输出这个数据
        /// \param pCutOffset 切面偏移，在不忽略切面且声明使用自定义切面的情况下，会根据这个切面偏移进行裁剪；可能为空，空表示不需要输出这个数据
        /// \return 是否忽略
        virtual bool SkipPlaneInDepth(const IModelView* pModelView, bool *pIsSkipCutPlane, double *pCutOffset) const = 0;
        /// \brief 是否忽略视图视口的平面，使其不参与是否视图范围检查、剖切等。
        /// \param pModelView 视图指针
        /// \return 是否忽略
        virtual bool SkipPlaneInViewport(const IModelView* pModelView) const = 0;

        /// \brief 当element跨平面区域时，得到自定义不可见区域
        ///  若element主视图不可见，则返回ModelView的Id
        /// \param pModelView 视图指针
        /// \param pElement 当前构件指针
        /// \param crossAreas 构件所跨区域的ElementId集（其中包含ModelViewId）
        /// \return 自定义不可见区域的ElementId（若主视图也不可见，则需包括ModelViewId）
        virtual std::vector<ElementId> GetInvisibleAreasWhenAcrossPlanRegion(const IModelView* pModelView,
            const IElement* pElement, const std::vector<ElementId>& crossAreas) const;
    };
}


